package com.billdowney.webconfig;

import java.util.EventListener;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.security.web.session.HttpSessionEventPublisher;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;

import com.billdowney.intercept.VisitRecordInterceptor;
import com.billdowney.listener.ContentListener;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;

/**
 * web配置文件
 * 
 * @author 超级小富翁 - BillDowney
 * @date 2019年1月8日 下午11:39:28
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {

	@Autowired
	private VisitRecordInterceptor visitRecordInterceptor;// 访问记录拦截器
	@Autowired
	private ContentListener contentListener;// 项目内容监听器
	@Autowired
	private HttpSessionEventPublisher httpSessionEventPublisher;// spring security监听器

	/**
	 * 配置拦截器
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(visitRecordInterceptor);
	}

	/**
	 * 配置启动WebScoket
	 * 
	 * @return
	 * @author: 唐路钧
	 * @date: 2019年1月10日 下午4:22:49
	 */
	@Bean
	public ServerEndpointExporter serverEndpointExporter() {
		return new ServerEndpointExporter();
	}

	/**
	 * 配置监听器
	 * 
	 * @return
	 * @author: 唐路钧
	 * @date: 2019年1月14日 上午12:23:19
	 */
	@Bean
	public ServletListenerRegistrationBean<EventListener> listenerRegist() {
		ServletListenerRegistrationBean<EventListener> srb = new ServletListenerRegistrationBean<EventListener>();
		srb.setListener(contentListener);
		srb.setListener(httpSessionEventPublisher);
		return srb;
	}

	/**
	 * 配置跨域访问
	 */
	@Override
	public void addCorsMappings(CorsRegistry registry) {
		// 设置允许跨域的路径
		registry.addMapping("/**")
				// 设置允许跨域请求的域名
				.allowedOrigins("*")
				// 是否允许证书 不再默认开启
				.allowCredentials(true)
				// 设置允许的方法
				.allowedMethods("*").allowedHeaders("*")
				// 跨域允许时间
				.maxAge(3600);
	}

//	@Bean
//	public TomcatServletWebServerFactory servletContainer1() {
//		TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
//			@Override
//			protected void postProcessContext(Context context) {
//				context.addWelcomeFile("index.html");
//			}
//		};
//		return tomcat;
//	}

	/**
	 * 默认跳转的首页
	 */
//	@Override
//	public void addViewControllers(ViewControllerRegistry registry) {
//		registry.addViewController("/").setViewName("forward:/index");
//		registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
//		WebMvcConfigurer.super.addViewControllers(registry);
//	}

	/**
	 * 添加jackson配置
	 * 
	 * @param builder
	 * @return
	 * @author: 唐路钧
	 * @date: 2019年1月23日 下午3:31:39
	 */
	@Bean
	@Primary
	@ConditionalOnMissingBean(ObjectMapper.class)
	public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
		// 处理懒加载对象
		Hibernate5Module hibernate5Module = new Hibernate5Module();
		hibernate5Module.configure(Hibernate5Module.Feature.FORCE_LAZY_LOADING, false);
		builder.modulesToInstall(hibernate5Module);
		// .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).modulesToInstall(hibernate5Module);
		return builder.build();
	}

}
